package com.spit.amoeba.base

import android.animation.ValueAnimator
import android.os.Bundle
import androidx.databinding.ViewDataBinding
import com.spit.fammo.MainActivity
import com.spit.fammo.ext.dismissLoadingExt
import com.spit.fammo.ext.showLoadingExt
import me.hgj.jetpackmvvm.base.fragment.BaseVmDbFragment
import me.hgj.jetpackmvvm.base.viewmodel.BaseViewModel

/**
 * 作者　: hegaojian
 * 时间　: 2019/12/21
 * 描述　: 你项目中的Fragment基类，在这里实现显示弹窗，吐司，还有自己的需求操作 ，如果不想用Databind，请继承
 * BaseVmFragment例如
 * abstract class BaseFragment<VM : BaseViewModel> : BaseVmFragment<VM>() {
 */
abstract class BaseFragment<VM : BaseViewModel, DB : ViewDataBinding> : BaseVmDbFragment<VM, DB>() {


    abstract override fun initView(savedInstanceState: Bundle?)

    /**
     * 懒加载 只有当前fragment视图显示时才会触发该方法
     */
    override fun lazyLoadData() {
    }

    /**
     * 创建LiveData观察者 Fragment执行onViewCreated后触发
     */
    override fun createObserver() {}

    /**
     * Fragment执行onViewCreated后触发
     */
    override fun initData() {

    }

    /**
     * 打开等待框
     */
    override fun showLoading(message: String) {
        showLoadingExt(message)
    }

    /**
     * 关闭等待框
     */
    override fun dismissLoading() {
        dismissLoadingExt()
    }

    override fun onPause() {
        super.onPause()
//        hideSoftKeyboard(activity)
    }

    /**
     * 延迟加载 防止 切换动画还没执行完毕时数据就已经加载好了，这时页面会有渲染卡顿  bug
     * 这里传入你想要延迟的时间，延迟时间可以设置比转场动画时间长一点 单位： 毫秒
     * 不传默认 300毫秒
     * @return Long
     */
    override fun lazyLoadTime(): Long {
        return 300
    }

//    fun setToolBarTitle(title: String?){
//        if (title != null){
//            (activity as? MainActivity)?.supportActionBar?.title = title
//        }
//    }

     fun setToolBarTitle(title: String?) {
         setTitle(title, false)
    }
     fun setToolBarTitle(title: String?, isAnimator: Boolean) {
         setTitle(title, false)
    }

    private fun setTitle(title: String?, isAnimator: Boolean){
        if (title != null) {
            animator?.cancel()
            if (isAnimator){
                // 使用正则表达式提取括号内的数字
                val numberPattern = Regex("\\((\\d+)\\)")
                val matchResult = numberPattern.find(title)
                val newNumber = matchResult?.groupValues?.get(1)?.toIntOrNull() ?: 0

                // 获取当前标题
                val currentTitle = (activity as? MainActivity)?.supportActionBar?.title.toString()
                val currentMatchResult = numberPattern.find(currentTitle)
                val currentNumber = currentMatchResult?.groupValues?.get(1)?.toIntOrNull() ?: 0

                // 检查是否提取到有效的数字
                if (newNumber > 0 && isAnimator) {
                    // 如果提取到有效的数字，启动动画
                    animateTitleFromTo(currentNumber, newNumber, title)
                } else {
                    // 如果提取的数字无效，直接设置标题
                    (activity as? MainActivity)?.supportActionBar?.title = title
                }
            }else{
                (activity as? MainActivity)?.supportActionBar?.title = title
            }
        }
    }

    private var animator: ValueAnimator? = null

    private fun animateTitleFromTo(start: Int, end: Int, titleTemplate: String) {
        // 如果动画已经存在，取消之前的动画
        animator?.cancel()

        // 创建新的 ValueAnimator
        animator = ValueAnimator.ofInt(start, end).apply {
            duration = 500 // 设置动画持续时间为 2000 毫秒（2 秒）
            addUpdateListener { animation ->
                // 获取当前动画的值
                val currentValue = animation.animatedValue as Int
                // 更新标题，保留其他内容
                val updatedTitle = titleTemplate.replaceFirst(Regex("\\(\\d+\\)"), "($currentValue)")
                (activity as? MainActivity)?.supportActionBar?.title = updatedTitle
            }
            start() // 启动动画
        }
    }

}